{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>movie_id</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>47</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:32:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>293</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:31:43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>296</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:32:47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>653</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2004-09-10 03:08:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1080</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:42:55</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id  movie_id  rating            timestamp\n",
       "0        1        47     3.5  2005-04-02 23:32:07\n",
       "1        1       293     4.0  2005-04-02 23:31:43\n",
       "2        1       296     4.0  2005-04-02 23:32:47\n",
       "3        1       653     3.0  2004-09-10 03:08:11\n",
       "4        1      1080     3.5  2005-04-02 23:42:55"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating_training = pd.read_csv('./data/rating_training.csv')\n",
    "df_rating_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "## 将user_id转化为user_index\n",
    "# 参数规定类型为字符串，传参必须是字符串\n",
    "def df_id_to_index(df,obj_id_name:str,obj_index_name:str=None):\n",
    "    obj_id_to_index_dict = {}\n",
    "    obj_index_to_id_dict = {}\n",
    "    \n",
    "    ids = df[obj_id_name].unique().tolist()\n",
    "    \n",
    "    for index,_id in enumerate(ids):\n",
    "        obj_id_to_index_dict[_id] = index\n",
    "        obj_index_to_id_dict[index] = _id\n",
    "    \n",
    "    df[obj_id_name] = df[obj_id_name].apply(\n",
    "        lambda obj_id : obj_id_to_index_dict[obj_id]\n",
    "    )\n",
    "    if obj_index_name:\n",
    "        column_names = df.columns.tolist()\n",
    "        for index,column_name in enumerate(column_names):\n",
    "            if column_name == obj_id_name:\n",
    "                column_names[index] = obj_index_name\n",
    "        df.columns = column_names\n",
    "        df[obj_index_name] = df[obj_index_name].astype(int)\n",
    "    return obj_id_to_index_dict,obj_index_to_id_dict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 把userd_id列名改为 userd_index\n",
    "user_id_to_index_dict,user_index_to_id_dict = df_id_to_index(df_rating_training,'user_id','user_index')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_index</th>\n",
       "      <th>movie_id</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>47</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:32:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>293</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:31:43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>296</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:32:47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>653</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2004-09-10 03:08:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>1080</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:42:55</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_index  movie_id  rating            timestamp\n",
       "0           0        47     3.5  2005-04-02 23:32:07\n",
       "1           0       293     4.0  2005-04-02 23:31:43\n",
       "2           0       296     4.0  2005-04-02 23:32:47\n",
       "3           0       653     3.0  2004-09-10 03:08:11\n",
       "4           0      1080     3.5  2005-04-02 23:42:55"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 3380487 entries, 0 to 3380486\n",
      "Data columns (total 4 columns):\n",
      " #   Column      Dtype  \n",
      "---  ------      -----  \n",
      " 0   user_index  int32  \n",
      " 1   movie_id    int64  \n",
      " 2   rating      float64\n",
      " 3   timestamp   object \n",
      "dtypes: float64(1), int32(1), int64(1), object(1)\n",
      "memory usage: 90.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating_training.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "movie_id_to_index_dict,movie_index_to_id_dict = df_id_to_index(df_rating_training,'movie_id','movie_index')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_index</th>\n",
       "      <th>movie_index</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:32:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:31:43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:32:47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2004-09-10 03:08:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:42:55</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_index  movie_index  rating            timestamp\n",
       "0           0            0     3.5  2005-04-02 23:32:07\n",
       "1           0            1     4.0  2005-04-02 23:31:43\n",
       "2           0            2     4.0  2005-04-02 23:32:47\n",
       "3           0            3     3.0  2004-09-10 03:08:11\n",
       "4           0            4     3.5  2005-04-02 23:42:55"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 3380487 entries, 0 to 3380486\n",
      "Data columns (total 4 columns):\n",
      " #   Column       Dtype  \n",
      "---  ------       -----  \n",
      " 0   user_index   int32  \n",
      " 1   movie_index  int32  \n",
      " 2   rating       float64\n",
      " 3   timestamp    object \n",
      "dtypes: float64(1), int32(2), object(1)\n",
      "memory usage: 77.4+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating_training.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1112455927"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将字符串时间转化为时间序列\n",
    "a = '2005-04-02 23:32:07'\n",
    "int(time.mktime(time.strptime(a,'%Y-%m-%d %H:%M:%S')))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_index</th>\n",
       "      <th>movie_index</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1112455927</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1112455903</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1112455967</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1094756891</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1112456575</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_index  movie_index  rating   timestamp\n",
       "0           0            0     3.5  1112455927\n",
       "1           0            1     4.0  1112455903\n",
       "2           0            2     4.0  1112455967\n",
       "3           0            3     3.0  1094756891\n",
       "4           0            4     3.5  1112456575"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating_training['timestamp'] = df_rating_training['timestamp'].apply(\n",
    "    lambda time_str :\n",
    "    int(time.mktime(time.strptime(time_str,'%Y-%m-%d %H:%M:%S')))\n",
    ")\n",
    "df_rating_training['timestamp'] = df_rating_training['timestamp'].astype(int)\n",
    "df_rating_training.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "df_rating_training.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 用户和商品的打分矩阵 用户和商品时间矩阵 用户的活跃度向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "52188\n",
      "7994\n"
     ]
    }
   ],
   "source": [
    "user_quantity = len(df_rating_training['user_index'].unique())\n",
    "movie_quantity = len(df_rating_training['movie_index'].unique())\n",
    "print(user_quantity)\n",
    "print(movie_quantity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "ename": "MemoryError",
     "evalue": "Unable to allocate array with shape (52188, 7994) and data type float64",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mMemoryError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-42-2161d30e37d0>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0muser_movie_rating_array\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0muser_quantity\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mmovie_quantity\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      2\u001b[0m \u001b[0muser_movie_time_array\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0muser_quantity\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mmovie_quantity\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0muser_popular_v\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0muser_quantity\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mMemoryError\u001b[0m: Unable to allocate array with shape (52188, 7994) and data type float64"
     ]
    }
   ],
   "source": [
    "user_movie_rating_array = np.zeros(shape=(user_quantity,movie_quantity))\n",
    "user_movie_time_array = np.zeros(shape=(user_quantity,movie_quantity))\n",
    "user_popular_v = np.zeros(shape=user_quantity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0..100..200..300..400..500..600..700..800..900..1000..1100..1200..1300..1400..1500..1600..1700..1800..1900..2000..2100..2200..2300..2400..2500..2600..2700..2800..2900..3000..3100..3200..3300..3400..3500..3600..3700..3800..3900..4000..4100..4200..4300..4400..4500..4600..4700..4800..4900..5000..5100..5200..5300..5400..5500..5600..5700..5800..5900..6000..6100..6200..6300..6400..6500..6600..6700..6800..6900..7000..7100..7200..7300..7400..7500..7600..7700..7800..7900..8000..8100..8200..8300..8400..8500..8600..8700..8800..8900..9000..9100..9200..9300..9400..9500..9600..9700..9800..9900..10000..10100..10200..10300..10400..10500..10600..10700..10800..10900..11000..11100..11200..11300..11400..11500..11600..11700..11800..11900..12000..12100..12200..12300..12400..12500..12600..12700..12800..12900..13000..13100..13200..13300..13400..13500..13600..13700..13800..13900..14000..14100..14200..14300..14400..14500..14600..14700..14800..14900..15000..15100..15200..15300..15400..15500..15600..15700..15800..15900..16000..16100..16200..16300..16400..16500..16600..16700..16800..16900..17000..17100..17200..17300..17400..17500..17600..17700..17800..17900..18000..18100..18200..18300..18400..18500..18600..18700..18800..18900..19000..19100..19200..19300..19400..19500..19600..19700..19800..19900..20000..20100..20200..20300..20400..20500..20600..20700..20800..20900..21000..21100..21200..21300..21400..21500..21600..21700..21800..21900..22000..22100..22200..22300..22400..22500..22600..22700..22800..22900..23000..23100..23200..23300..23400..23500..23600..23700..23800..23900..24000..24100..24200..24300..24400..24500..24600..24700..24800..24900..25000..25100..25200..25300..25400..25500..25600..25700..25800..25900..26000..26100..26200..26300..26400..26500..26600..26700..26800..26900..27000..27100..27200..27300..27400..27500..27600..27700..27800..27900..28000..28100..28200..28300..28400..28500..28600..28700..28800..28900..29000..29100..29200..29300..29400..29500..29600..29700..29800..29900..30000..30100..30200..30300..30400..30500..30600..30700..30800..30900..31000..31100..31200..31300..31400..31500..31600..31700..31800..31900..32000..32100..32200..32300..32400..32500..32600..32700..32800..32900..33000..33100..33200..33300..33400..33500..33600..33700..33800..33900..34000..34100..34200..34300..34400..34500..34600..34700..34800..34900..35000..35100..35200..35300..35400..35500..35600..35700..35800..35900..36000..36100..36200..36300..36400..36500..36600..36700..36800..36900..37000..37100..37200..37300..37400..37500..37600..37700..37800..37900..38000..38100..38200..38300..38400..38500..38600..38700..38800..38900..39000..39100..39200..39300..39400..39500..39600..39700..39800..39900..40000..40100..40200..40300..40400..40500..40600..40700..40800..40900..41000..41100..41200..41300..41400..41500..41600..41700..41800..41900..42000..42100..42200..42300..42400..42500..42600..42700..42800..42900..43000..43100..43200..43300..43400..43500..43600..43700..43800..43900..44000..44100..44200..44300..44400..44500..44600..44700..44800..44900..45000..45100..45200..45300..45400..45500..45600..45700..45800..45900..46000..46100..46200..46300..46400..46500..46600..46700..46800..46900..47000..47100..47200..47300..47400..47500..47600..47700..47800..47900..48000..48100..48200..48300..48400..48500..48600..48700..48800..48900..49000..49100..49200..49300..49400..49500..49600..49700..49800..49900..50000..50100..50200..50300..50400..50500..50600..50700..50800..50900..51000..51100..51200..51300..51400..51500..51600..51700..51800..51900..52000..52100.."
     ]
    }
   ],
   "source": [
    "# 打分商品，和打分时间\n",
    "for user_index,groupby_userindex in df_rating_training.groupby('user_index'):\n",
    "    movies_rating = groupby_userindex.groupby('movie_index')['rating'].mean()\n",
    "    movies_time = groupby_userindex.groupby('movie_index')['timestamp'].mean()\n",
    "    # 打分\n",
    "    for movie_index in movies_rating.index:\n",
    "        user_movie_rating_array[user_index][movie_index] = movies_rating[movie_index]\n",
    "    # 时间\n",
    "    for movie_index in movies_time.index:\n",
    "        user_movie_time_array[user_index][movie_index] = movies_time[movie_index]\n",
    "    # 用户的活跃度向量\n",
    "    user_popular_v[user_index] = len(movies_rating)\n",
    "    if user_index % 100 == 0:print(user_index,end='..')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[3.5, 4. , 4. , ..., 0. , 0. , 0. ],\n",
       "       [0. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
       "       [0. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
       "       ...,\n",
       "       [3.5, 0. , 0. , ..., 0. , 0. , 0. ],\n",
       "       [0. , 0. , 4. , ..., 0. , 0. , 0. ],\n",
       "       [0. , 0. , 4.5, ..., 0. , 0. , 0. ]])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_movie_rating_array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.11245593e+09, 1.11245590e+09, 1.11245597e+09, ...,\n",
       "        0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n",
       "       [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n",
       "        0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n",
       "       [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n",
       "        0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n",
       "       ...,\n",
       "       [1.20704668e+09, 0.00000000e+00, 0.00000000e+00, ...,\n",
       "        0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n",
       "       [0.00000000e+00, 0.00000000e+00, 9.75514225e+08, ...,\n",
       "        0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n",
       "       [0.00000000e+00, 0.00000000e+00, 1.25578146e+09, ...,\n",
       "        0.00000000e+00, 0.00000000e+00, 0.00000000e+00]])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_movie_time_array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([43., 43., 51., ..., 42., 30., 93.])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_popular_v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.264, 0.264, 0.253, ..., 0.266, 0.291, 0.22 ])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_popular_punish_v = np.around(1 / np.log(1 + user_popular_v),3)\n",
    "user_popular_punish_v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 构建电影与电影之间的相似度矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "movie_sim_array = np.zeros(shape=(movie_quantity,movie_quantity))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# movie_user_dict = {}\n",
    "# for movie_index in range(movie_quantity):\n",
    "#     movie_user_dict[movie_index] = df_rating_training.query('movie_index == @movie_index')['user_index'].unique().tolist()\n",
    "#     if movie_index % 100 == 0:print(movie_index,end='..')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0..100..200..300..400..500..600..700..800..900..1000..1100..1200..1300..1400..1500..1600..1700..1800..1900..2000..2100..2200..2300..2400..2500..2600..2700..2800..2900..3000..3100..3200..3300..3400..3500..3600..3700..3800..3900..4000..4100..4200..4300..4400..4500..4600..4700..4800..4900..5000..5100..5200..5300..5400..5500..5600..5700..5800..5900..6000..6100..6200..6300..6400..6500..6600..6700..6800..6900..7000..7100..7200..7300..7400..7500..7600..7700..7800..7900.."
     ]
    }
   ],
   "source": [
    "movie_user_dict = {}\n",
    "for movie_index in range(movie_quantity):\n",
    "    movie_user_dict[movie_index] = np.where(user_movie_rating_array[:,movie_index] > 0)[0].tolist()\n",
    "    if movie_index % 100 == 0:print(movie_index,end='..')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Program Files (x86)\\anconda\\lib\\site-packages\\ipykernel_launcher.py:18: RuntimeWarning: invalid value encountered in double_scalars\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0..1..2..3..4..5..6..7..8..9..10..11..12..13..14..15..16..17..18..19..20..21..22..23..24..25..26..27..28..29..30..31..32..33..34..35..36..37..38..39..40..41..42..43..44..45..46..47..48..49..50..51..52..53..54..55..56..57..58..59..60..61..62..63..64..65..66..67..68..69..70..71..72..73..74..75..76..77..78..79..80..81..82..83..84..85..86..87..88..89..90..91..92..93..94..95..96..97..98..99..100..101..102..103..104..105..106..107..108..109..110..111..112..113..114..115..116..117..118..119..120..121..122..123..124..125..126..127..128..129..130..131..132..133..134..135..136..137..138..139..140..141..142..143..144..145..146..147..148..149..150..151..152..153..154..155..156..157..158..159..160..161..162..163..164..165..166..167..168..169..170..171..172..173..174..175..176..177..178..179..180..181..182..183..184..185..186..187..188..189..190..191..192..193..194..195..196..197..198..199..200..201..202..203..204..205..206..207..208..209..210..211..212..213..214..215..216..217..218..219..220..221..222..223..224..225..226..227..228..229..230..231..232..233..234..235..236..237..238..239..240..241..242..243..244..245..246..247..248..249..250..251..252..253..254..255..256..257..258..259..260..261..262..263..264..265..266..267..268..269..270..271..272..273..274..275..276..277..278..279..280..281..282..283..284..285..286..287..288..289..290..291..292..293..294..295..296..297..298..299..300..301..302..303..304..305..306..307..308..309..310..311..312..313..314..315..316..317..318..319..320..321..322..323..324..325..326..327..328..329..330..331..332..333..334..335..336..337..338..339..340..341..342..343..344..345..346..347..348..349..350..351..352..353..354..355..356..357..358..359..360..361..362..363..364..365..366..367..368..369..370..371..372..373..374..375..376..377..378..379..380..381..382..383..384..385..386..387..388..389..390..391..392..393..394..395..396..397..398..399..400..401..402..403..404..405..406..407..408..409..410..411..412..413..414..415..416..417..418..419..420..421..422..423..424..425..426..427..428..429..430..431..432..433..434..435..436..437..438..439..440..441..442..443..444..445..446..447..448..449..450..451..452..453..454..455..456..457..458..459..460..461..462..463..464..465..466..467..468..469..470..471..472..473..474..475..476..477..478..479..480..481..482..483..484..485..486..487..488..489..490..491..492..493..494..495..496..497..498..499..500..501..502..503..504..505..506..507..508..509..510..511..512..513..514..515..516..517..518..519..520..521..522..523..524..525..526..527..528..529..530..531..532..533..534..535..536..537..538..539..540..541..542..543..544..545..546..547..548..549..550..551..552..553..554..555..556..557..558..559..560..561..562..563..564..565..566..567..568..569..570..571..572..573..574..575..576..577..578..579..580..581..582..583..584..585..586..587..588..589..590..591..592..593..594..595..596..597..598..599..600..601..602..603..604..605..606..607..608..609..610..611..612..613..614..615..616..617..618..619..620..621..622..623..624..625..626..627..628..629..630..631..632..633..634..635..636..637..638..639..640..641..642..643..644..645..646..647..648..649..650..651..652..653..654..655..656..657..658..659..660..661..662..663..664..665..666..667..668..669..670..671..672..673..674..675..676..677..678..679..680..681..682..683..684..685..686..687..688..689..690..691..692..693..694..695..696..697..698..699..700..701..702..703..704..705..706..707..708..709..710..711..712..713..714..715..716..717..718..719..720..721..722..723..724..725..726..727..728..729..730..731..732..733..734..735..736..737..738..739..740..741..742..743..744..745..746..747..748..749..750..751..752..753..754..755..756..757..758..759..760..761..762..763..764..765..766..767..768..769..770..771..772..773..774..775..776..777..778..779..780..781..782..783..784..785..786..787..788..789..790..791..792..793..794..795..796..797..798..799..800..801..802..803..804..805..806..807..808..809..810..811..812..813..814..815..816..817..818..819..820..821..822..823..824..825..826..827..828..829..830..831..832..833..834..835..836..837..838..839..840..841..842..843..844..845..846..847..848..849..850..851..852..853..854..855..856..857..858..859..860..861..862..863..864..865..866..867..868..869..870..871..872..873..874..875..876..877..878..879..880..881..882..883..884..885..886..887..888..889..890..891..892..893..894..895..896..897..898..899..900..901..902..903..904..905..906..907..908..909..910..911..912..913..914..915..916..917..918..919..920..921..922..923..924..925..926..927..928..929..930..931..932..933..934..935..936..937..938..939..940..941..942..943..944..945..946..947..948..949..950..951..952..953..954..955..956..957..958..959..960..961..962..963..964..965..966..967..968..969..970..971..972..973..974..975..976..977..978..979..980..981..982..983..984..985..986..987..988..989..990..991..992..993..994..995..996..997..998..999..1000..1001..1002..1003..1004..1005..1006..1007..1008..1009..1010..1011..1012..1013..1014..1015..1016..1017..1018..1019..1020..1021..1022..1023..1024..1025..1026..1027..1028..1029..1030..1031..1032..1033..1034..1035..1036..1037..1038..1039..1040..1041..1042..1043..1044..1045..1046..1047..1048..1049..1050..1051..1052..1053..1054..1055..1056..1057..1058..1059..1060..1061..1062..1063..1064..1065..1066..1067..1068..1069..1070..1071..1072..1073..1074..1075..1076..1077..1078..1079..1080..1081..1082..1083..1084..1085..1086..1087..1088..1089..1090..1091..1092..1093..1094..1095..1096..1097..1098..1099..1100..1101..1102..1103..1104..1105..1106..1107..1108..1109..1110..1111..1112..1113..1114..1115..1116..1117..1118..1119..1120..1121..1122..1123..1124..1125..1126..1127..1128..1129..1130..1131..1132..1133..1134..1135..1136..1137..1138..1139..1140..1141..1142..1143..1144..1145..1146..1147..1148..1149..1150..1151..1152..1153..1154..1155..1156..1157..1158..1159..1160..1161..1162..1163..1164..1165..1166..1167..1168..1169..1170..1171..1172..1173..1174..1175..1176..1177..1178..1179..1180..1181..1182..1183..1184..1185..1186..1187..1188..1189..1190..1191..1192..1193..1194..1195..1196..1197..1198..1199..1200..1201..1202..1203..1204..1205..1206..1207..1208..1209..1210..1211..1212..1213..1214..1215..1216..1217..1218..1219..1220..1221..1222..1223..1224..1225..1226..1227..1228..1229..1230..1231..1232..1233..1234..1235..1236..1237..1238..1239..1240..1241..1242..1243..1244..1245..1246..1247..1248..1249..1250..1251..1252..1253..1254..1255..1256..1257..1258..1259..1260..1261..1262..1263..1264..1265..1266..1267..1268..1269..1270..1271..1272..1273..1274..1275..1276..1277..1278..1279..1280..1281..1282..1283..1284..1285..1286..1287..1288..1289..1290..1291..1292..1293..1294..1295..1296..1297..1298..1299..1300..1301..1302..1303..1304..1305..1306..1307..1308..1309..1310..1311..1312..1313..1314..1315..1316..1317..1318..1319..1320..1321..1322..1323..1324..1325..1326..1327..1328..1329..1330..1331..1332..1333..1334..1335..1336..1337..1338..1339..1340..1341..1342..1343..1344..1345..1346..1347..1348..1349..1350..1351..1352..1353..1354..1355..1356..1357..1358..1359..1360..1361..1362..1363..1364..1365..1366..1367..1368..1369..1370..1371..1372..1373..1374..1375..1376..1377..1378..1379..1380..1381..1382..1383..1384..1385..1386..1387..1388..1389..1390..1391..1392..1393..1394..1395..1396..1397..1398..1399..1400..1401..1402..1403..1404..1405..1406..1407..1408..1409..1410..1411..1412..1413..1414..1415..1416..1417..1418..1419..1420..1421..1422..1423..1424..1425..1426..1427..1428..1429..1430..1431..1432..1433..1434..1435..1436..1437..1438..1439..1440..1441..1442..1443..1444..1445..1446..1447..1448..1449..1450..1451..1452..1453..1454..1455..1456..1457..1458..1459..1460..1461..1462..1463..1464..1465..1466..1467..1468..1469..1470..1471..1472..1473..1474..1475..1476..1477..1478..1479..1480..1481..1482..1483..1484..1485..1486..1487..1488..1489..1490..1491..1492..1493..1494..1495..1496..1497..1498..1499..1500..1501..1502..1503..1504..1505..1506..1507..1508..1509..1510..1511..1512..1513..1514..1515..1516..1517..1518..1519..1520..1521..1522..1523..1524..1525..1526..1527..1528..1529..1530..1531..1532..1533..1534..1535..1536..1537..1538..1539..1540..1541..1542..1543..1544..1545..1546..1547..1548..1549..1550.."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1551..1552..1553..1554..1555..1556..1557..1558..1559..1560..1561..1562..1563..1564..1565..1566..1567..1568..1569..1570..1571..1572..1573..1574..1575..1576..1577..1578..1579..1580..1581..1582..1583..1584..1585..1586..1587..1588..1589..1590..1591..1592..1593..1594..1595..1596..1597..1598..1599..1600..1601..1602..1603..1604..1605..1606..1607..1608..1609..1610..1611..1612..1613..1614..1615..1616..1617..1618..1619..1620..1621..1622..1623..1624..1625..1626..1627..1628..1629..1630..1631..1632..1633..1634..1635..1636..1637..1638..1639..1640..1641..1642..1643..1644..1645..1646..1647..1648..1649..1650..1651..1652..1653..1654..1655..1656..1657..1658..1659..1660..1661..1662..1663..1664..1665..1666..1667..1668..1669..1670..1671..1672..1673..1674..1675..1676..1677..1678..1679..1680..1681..1682..1683..1684..1685..1686..1687..1688..1689..1690..1691..1692..1693..1694..1695..1696..1697..1698..1699..1700..1701..1702..1703..1704..1705..1706..1707..1708..1709..1710..1711..1712..1713..1714..1715..1716..1717..1718..1719..1720..1721..1722..1723..1724..1725..1726..1727..1728..1729..1730..1731..1732..1733..1734..1735..1736..1737..1738..1739..1740..1741..1742..1743..1744..1745..1746..1747..1748..1749..1750..1751..1752..1753..1754..1755..1756..1757..1758..1759..1760..1761..1762..1763..1764..1765..1766..1767..1768..1769..1770..1771..1772..1773..1774..1775..1776..1777..1778..1779..1780..1781..1782..1783..1784..1785..1786..1787..1788..1789..1790..1791..1792..1793..1794..1795..1796..1797..1798..1799..1800..1801..1802..1803..1804..1805..1806..1807..1808..1809..1810..1811..1812..1813..1814..1815..1816..1817..1818..1819..1820..1821..1822..1823..1824..1825..1826..1827..1828..1829..1830..1831..1832..1833..1834..1835..1836..1837..1838..1839..1840..1841..1842..1843..1844..1845..1846..1847..1848..1849..1850..1851..1852..1853..1854..1855..1856..1857..1858..1859..1860..1861..1862..1863..1864..1865..1866..1867..1868..1869..1870..1871..1872..1873..1874..1875..1876..1877..1878..1879..1880..1881..1882..1883..1884..1885..1886..1887..1888..1889..1890..1891..1892..1893..1894..1895..1896..1897..1898..1899..1900..1901..1902..1903..1904..1905..1906..1907..1908..1909..1910..1911..1912..1913..1914..1915..1916..1917..1918..1919..1920..1921..1922..1923..1924..1925..1926..1927..1928..1929..1930..1931..1932..1933..1934..1935..1936..1937..1938..1939..1940..1941..1942..1943..1944..1945..1946..1947..1948..1949..1950..1951..1952..1953..1954..1955..1956..1957..1958..1959..1960..1961..1962..1963..1964..1965..1966..1967..1968..1969..1970..1971..1972..1973..1974..1975..1976..1977..1978..1979..1980..1981..1982..1983..1984..1985..1986..1987..1988..1989..1990..1991..1992..1993..1994..1995..1996..1997..1998..1999..2000..2001..2002..2003..2004..2005..2006..2007..2008..2009..2010..2011..2012..2013..2014..2015..2016..2017..2018..2019..2020..2021..2022..2023..2024..2025..2026..2027..2028..2029..2030..2031..2032..2033..2034..2035..2036..2037..2038..2039..2040..2041..2042..2043..2044..2045..2046..2047..2048..2049..2050..2051..2052..2053..2054..2055..2056..2057..2058..2059..2060..2061..2062..2063..2064..2065..2066..2067..2068..2069..2070..2071..2072..2073..2074..2075..2076..2077..2078..2079..2080..2081..2082..2083..2084..2085..2086..2087..2088..2089..2090..2091..2092..2093..2094..2095..2096..2097..2098..2099..2100..2101..2102..2103..2104..2105..2106..2107..2108..2109..2110..2111..2112..2113..2114..2115..2116..2117..2118..2119..2120..2121..2122..2123..2124..2125..2126..2127..2128..2129..2130..2131..2132..2133..2134..2135..2136..2137..2138..2139..2140..2141..2142..2143..2144..2145..2146..2147..2148..2149..2150..2151..2152..2153..2154..2155..2156..2157..2158..2159..2160..2161..2162..2163..2164..2165..2166..2167..2168..2169..2170..2171..2172..2173..2174..2175..2176..2177..2178..2179..2180..2181..2182..2183..2184..2185..2186..2187..2188..2189..2190..2191..2192..2193..2194..2195..2196..2197..2198..2199..2200..2201..2202..2203..2204..2205..2206..2207..2208..2209..2210..2211..2212..2213..2214..2215..2216..2217..2218..2219..2220..2221..2222..2223..2224..2225..2226..2227..2228..2229..2230..2231..2232..2233..2234..2235..2236..2237..2238..2239..2240..2241..2242..2243..2244..2245..2246..2247..2248..2249..2250..2251..2252..2253..2254..2255..2256..2257..2258..2259..2260..2261..2262..2263..2264..2265..2266..2267..2268..2269..2270..2271..2272..2273..2274..2275..2276..2277..2278..2279..2280..2281..2282..2283..2284..2285..2286..2287..2288..2289..2290..2291..2292..2293..2294..2295..2296..2297..2298..2299..2300..2301..2302..2303..2304..2305..2306..2307..2308..2309..2310..2311..2312..2313..2314..2315..2316..2317..2318..2319..2320..2321..2322..2323..2324..2325..2326..2327..2328..2329..2330..2331..2332..2333..2334..2335..2336..2337..2338..2339..2340..2341..2342..2343..2344..2345..2346..2347..2348..2349..2350..2351..2352..2353..2354..2355..2356..2357..2358..2359..2360..2361..2362..2363..2364..2365..2366..2367..2368..2369..2370..2371..2372..2373..2374..2375..2376..2377..2378..2379..2380..2381..2382..2383..2384..2385..2386..2387..2388..2389..2390..2391..2392..2393..2394..2395..2396..2397..2398..2399..2400..2401..2402..2403..2404..2405..2406..2407..2408..2409..2410..2411..2412..2413..2414..2415..2416..2417..2418..2419..2420..2421..2422..2423..2424..2425..2426..2427..2428..2429..2430..2431..2432..2433..2434..2435..2436..2437..2438..2439..2440..2441..2442..2443..2444..2445..2446..2447..2448..2449..2450..2451..2452..2453..2454..2455..2456..2457..2458..2459..2460..2461..2462..2463..2464..2465..2466..2467..2468..2469..2470..2471..2472..2473..2474..2475..2476..2477..2478..2479..2480..2481..2482..2483..2484..2485..2486..2487..2488..2489..2490..2491..2492..2493..2494..2495..2496..2497..2498..2499..2500..2501..2502..2503..2504..2505..2506..2507..2508..2509..2510..2511..2512..2513..2514..2515..2516..2517..2518..2519..2520..2521..2522..2523..2524..2525..2526..2527..2528..2529..2530..2531..2532..2533..2534..2535..2536..2537..2538..2539..2540..2541..2542..2543..2544..2545..2546..2547..2548..2549..2550..2551..2552..2553..2554..2555..2556..2557..2558..2559..2560..2561..2562..2563..2564..2565..2566..2567..2568..2569..2570..2571..2572..2573..2574..2575..2576..2577..2578..2579..2580..2581..2582..2583..2584..2585..2586..2587..2588..2589..2590..2591..2592..2593..2594..2595..2596..2597..2598..2599..2600..2601..2602..2603..2604..2605..2606..2607..2608..2609..2610..2611..2612..2613..2614..2615..2616..2617..2618..2619..2620..2621..2622..2623..2624..2625..2626..2627..2628..2629..2630..2631..2632..2633..2634..2635..2636..2637..2638..2639..2640..2641..2642..2643..2644..2645..2646..2647..2648..2649..2650..2651..2652..2653..2654..2655..2656..2657..2658..2659..2660..2661..2662..2663..2664..2665..2666..2667..2668..2669..2670..2671..2672..2673..2674..2675..2676..2677..2678..2679..2680..2681..2682..2683..2684..2685..2686..2687..2688..2689..2690..2691..2692..2693..2694..2695..2696..2697..2698..2699..2700..2701..2702..2703..2704..2705..2706..2707..2708..2709..2710..2711..2712..2713..2714..2715..2716..2717..2718..2719..2720..2721..2722..2723..2724..2725..2726..2727..2728..2729..2730..2731..2732..2733..2734..2735..2736..2737..2738..2739..2740..2741..2742..2743..2744..2745..2746..2747..2748..2749..2750..2751..2752..2753..2754..2755..2756..2757..2758..2759..2760..2761..2762..2763..2764..2765..2766..2767..2768..2769..2770..2771..2772..2773..2774..2775..2776..2777..2778..2779..2780..2781..2782..2783..2784..2785..2786..2787..2788..2789..2790..2791..2792..2793..2794..2795..2796..2797..2798..2799..2800..2801..2802..2803..2804..2805..2806..2807..2808..2809..2810..2811..2812..2813..2814..2815..2816..2817..2818..2819..2820..2821..2822..2823..2824..2825..2826..2827..2828..2829..2830..2831..2832..2833..2834..2835..2836..2837..2838..2839..2840..2841..2842..2843..2844..2845..2846..2847..2848..2849..2850..2851..2852..2853..2854..2855..2856..2857..2858..2859..2860..2861..2862..2863..2864..2865..2866..2867..2868..2869..2870..2871..2872..2873..2874..2875..2876..2877..2878..2879..2880..2881..2882..2883..2884..2885..2886..2887..2888..2889..2890..2891..2892..2893..2894..2895..2896..2897..2898..2899..2900..2901..2902..2903..2904..2905..2906..2907..2908..2909..2910..2911..2912..2913..2914..2915..2916.."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2917..2918..2919..2920..2921..2922..2923..2924..2925..2926..2927..2928..2929..2930..2931..2932..2933..2934..2935..2936..2937..2938..2939..2940..2941..2942..2943..2944..2945..2946..2947..2948..2949..2950..2951..2952..2953..2954..2955..2956..2957..2958..2959..2960..2961..2962..2963..2964..2965..2966..2967..2968..2969..2970..2971..2972..2973..2974..2975..2976..2977..2978..2979..2980..2981..2982..2983..2984..2985..2986..2987..2988..2989..2990..2991..2992..2993..2994..2995..2996..2997..2998..2999..3000..3001..3002..3003..3004..3005..3006..3007..3008..3009..3010..3011..3012..3013..3014..3015..3016..3017..3018..3019..3020..3021..3022..3023..3024..3025..3026..3027..3028..3029..3030..3031..3032..3033..3034..3035..3036..3037..3038..3039..3040..3041..3042..3043..3044..3045..3046..3047..3048..3049..3050..3051..3052..3053..3054..3055..3056..3057..3058..3059..3060..3061..3062..3063..3064..3065..3066..3067..3068..3069..3070..3071..3072..3073..3074..3075..3076..3077..3078..3079..3080..3081..3082..3083..3084..3085..3086..3087..3088..3089..3090..3091..3092..3093..3094..3095..3096..3097..3098..3099..3100..3101..3102..3103..3104..3105..3106..3107..3108..3109..3110..3111..3112..3113..3114..3115..3116..3117..3118..3119..3120..3121..3122..3123..3124..3125..3126..3127..3128..3129..3130..3131..3132..3133..3134..3135..3136..3137..3138..3139..3140..3141..3142..3143..3144..3145..3146..3147..3148..3149..3150..3151..3152..3153..3154..3155..3156..3157..3158..3159..3160..3161..3162..3163..3164..3165..3166..3167..3168..3169..3170..3171..3172..3173..3174..3175..3176..3177..3178..3179..3180..3181..3182..3183..3184..3185..3186..3187..3188..3189..3190..3191..3192..3193..3194..3195..3196..3197..3198..3199..3200..3201..3202..3203..3204..3205..3206..3207..3208..3209..3210..3211..3212..3213..3214..3215..3216..3217..3218..3219..3220..3221..3222..3223..3224..3225..3226..3227..3228..3229..3230..3231..3232..3233..3234..3235..3236..3237..3238..3239..3240..3241..3242..3243..3244..3245..3246..3247..3248..3249..3250..3251..3252..3253..3254..3255..3256..3257..3258..3259..3260..3261..3262..3263..3264..3265..3266..3267..3268..3269..3270..3271..3272..3273..3274..3275..3276..3277..3278..3279..3280..3281..3282..3283..3284..3285..3286..3287..3288..3289..3290..3291..3292..3293..3294..3295..3296..3297..3298..3299..3300..3301..3302..3303..3304..3305..3306..3307..3308..3309..3310..3311..3312..3313..3314..3315..3316..3317..3318..3319..3320..3321..3322..3323..3324..3325..3326..3327..3328..3329..3330..3331..3332..3333..3334..3335..3336..3337..3338..3339..3340..3341..3342..3343..3344..3345..3346..3347..3348..3349..3350..3351..3352..3353..3354..3355..3356..3357..3358..3359..3360..3361..3362..3363..3364..3365..3366..3367..3368..3369..3370..3371..3372..3373..3374..3375..3376..3377..3378..3379..3380..3381..3382..3383..3384..3385..3386..3387..3388..3389..3390..3391..3392..3393..3394..3395..3396..3397..3398..3399..3400..3401..3402..3403..3404..3405..3406..3407..3408..3409..3410..3411..3412..3413..3414..3415..3416..3417..3418..3419..3420..3421..3422..3423..3424..3425..3426..3427..3428..3429..3430..3431..3432..3433..3434..3435..3436..3437..3438..3439..3440..3441..3442..3443..3444..3445..3446..3447..3448..3449..3450..3451..3452..3453..3454..3455..3456..3457..3458..3459..3460..3461..3462..3463..3464..3465..3466..3467..3468..3469..3470..3471..3472..3473..3474..3475..3476..3477..3478..3479..3480..3481..3482..3483..3484..3485..3486..3487..3488..3489..3490..3491..3492..3493..3494..3495..3496..3497..3498..3499..3500..3501..3502..3503..3504..3505..3506..3507..3508..3509..3510..3511..3512..3513..3514..3515..3516..3517..3518..3519..3520..3521..3522..3523..3524..3525..3526..3527..3528..3529..3530..3531..3532..3533..3534..3535..3536..3537..3538..3539..3540..3541..3542..3543..3544..3545..3546..3547..3548..3549..3550..3551..3552..3553..3554..3555..3556..3557..3558..3559..3560..3561..3562..3563..3564..3565..3566..3567..3568..3569..3570..3571..3572..3573..3574..3575..3576..3577..3578..3579..3580..3581..3582..3583..3584..3585..3586..3587..3588..3589..3590..3591..3592..3593..3594..3595..3596..3597..3598..3599..3600..3601..3602..3603..3604..3605..3606..3607..3608..3609..3610..3611..3612..3613..3614..3615..3616..3617..3618..3619..3620..3621..3622..3623..3624..3625..3626..3627..3628..3629..3630..3631..3632..3633..3634..3635..3636..3637..3638..3639..3640..3641..3642..3643..3644..3645..3646..3647..3648..3649..3650..3651..3652..3653..3654..3655..3656..3657..3658..3659..3660..3661..3662..3663..3664..3665..3666..3667..3668..3669..3670..3671..3672..3673..3674..3675..3676..3677..3678..3679..3680..3681..3682..3683..3684..3685..3686..3687..3688..3689..3690..3691..3692..3693..3694..3695..3696..3697..3698..3699..3700..3701..3702..3703..3704..3705..3706..3707..3708..3709..3710..3711..3712..3713..3714..3715..3716..3717..3718..3719..3720..3721..3722..3723..3724..3725..3726..3727..3728..3729..3730..3731..3732..3733..3734..3735..3736..3737..3738..3739..3740..3741..3742..3743..3744..3745..3746..3747..3748..3749..3750..3751..3752..3753..3754..3755..3756..3757..3758..3759..3760..3761..3762..3763..3764..3765..3766..3767..3768..3769..3770..3771..3772..3773..3774..3775..3776..3777..3778..3779..3780..3781..3782..3783..3784..3785..3786..3787..3788..3789..3790..3791..3792..3793..3794..3795..3796..3797..3798..3799..3800..3801..3802..3803..3804..3805..3806..3807..3808..3809..3810..3811..3812..3813..3814..3815..3816..3817..3818..3819..3820..3821..3822..3823..3824..3825..3826..3827..3828..3829..3830..3831..3832..3833..3834..3835..3836..3837..3838..3839..3840..3841..3842..3843..3844..3845..3846..3847..3848..3849..3850..3851..3852..3853..3854..3855..3856..3857..3858..3859..3860..3861..3862..3863..3864..3865..3866..3867..3868..3869..3870..3871..3872..3873..3874..3875..3876..3877..3878..3879..3880..3881..3882..3883..3884..3885..3886..3887..3888..3889..3890..3891..3892..3893..3894..3895..3896..3897..3898..3899..3900..3901..3902..3903..3904..3905..3906..3907..3908..3909..3910..3911..3912..3913..3914..3915..3916..3917..3918..3919..3920..3921..3922..3923..3924..3925..3926..3927..3928..3929..3930..3931..3932..3933..3934..3935..3936..3937..3938..3939..3940..3941..3942..3943..3944..3945..3946..3947..3948..3949..3950..3951..3952..3953..3954..3955..3956..3957..3958..3959..3960..3961..3962..3963..3964..3965..3966..3967..3968..3969..3970..3971..3972..3973..3974..3975..3976..3977..3978..3979..3980..3981..3982..3983..3984..3985..3986..3987..3988..3989..3990..3991..3992..3993..3994..3995..3996..3997..3998..3999..4000..4001..4002..4003..4004..4005..4006..4007..4008..4009..4010..4011..4012..4013..4014..4015..4016..4017..4018..4019..4020..4021..4022..4023..4024..4025..4026..4027..4028..4029..4030..4031..4032..4033..4034..4035..4036..4037..4038..4039..4040..4041..4042..4043..4044..4045..4046..4047..4048..4049..4050..4051..4052..4053..4054..4055..4056..4057..4058..4059..4060..4061..4062..4063..4064..4065..4066..4067..4068..4069..4070..4071..4072..4073..4074..4075..4076..4077..4078..4079..4080..4081..4082..4083..4084..4085..4086..4087..4088..4089..4090..4091..4092..4093..4094..4095..4096..4097..4098..4099..4100..4101..4102..4103..4104..4105..4106..4107..4108..4109..4110..4111..4112..4113..4114..4115..4116..4117..4118..4119..4120..4121..4122..4123..4124..4125..4126..4127..4128..4129..4130..4131..4132..4133..4134..4135..4136..4137..4138..4139..4140..4141..4142..4143..4144..4145..4146..4147..4148..4149..4150..4151..4152..4153..4154..4155..4156..4157..4158..4159..4160..4161..4162..4163..4164..4165..4166..4167..4168..4169..4170..4171..4172..4173..4174..4175..4176..4177..4178..4179..4180..4181..4182..4183..4184..4185..4186..4187..4188..4189..4190..4191..4192..4193..4194..4195..4196..4197..4198..4199..4200..4201..4202..4203..4204..4205..4206..4207..4208..4209..4210..4211..4212..4213..4214..4215..4216..4217..4218..4219..4220..4221..4222..4223..4224..4225..4226..4227..4228..4229..4230..4231..4232..4233..4234..4235..4236..4237..4238..4239..4240..4241..4242..4243..4244..4245..4246..4247..4248..4249..4250..4251..4252..4253..4254..4255..4256..4257..4258..4259..4260..4261..4262..4263..4264..4265..4266..4267..4268..4269..4270..4271..4272..4273..4274..4275..4276..4277..4278..4279..4280..4281..4282"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "..4283..4284..4285..4286..4287..4288..4289..4290..4291..4292..4293..4294..4295..4296..4297..4298..4299..4300..4301..4302..4303..4304..4305..4306..4307..4308..4309..4310..4311..4312..4313..4314..4315..4316..4317..4318..4319..4320..4321..4322..4323..4324..4325..4326..4327..4328..4329..4330..4331..4332..4333..4334..4335..4336..4337..4338..4339..4340..4341..4342..4343..4344..4345..4346..4347..4348..4349..4350..4351..4352..4353..4354..4355..4356..4357..4358..4359..4360..4361..4362..4363..4364..4365..4366..4367..4368..4369..4370..4371..4372..4373..4374..4375..4376..4377..4378..4379..4380..4381..4382..4383..4384..4385..4386..4387..4388..4389..4390..4391..4392..4393..4394..4395..4396..4397..4398..4399..4400..4401..4402..4403..4404..4405..4406..4407..4408..4409..4410..4411..4412..4413..4414..4415..4416..4417..4418..4419..4420..4421..4422..4423..4424..4425..4426..4427..4428..4429..4430..4431..4432..4433..4434..4435..4436..4437..4438..4439..4440..4441..4442..4443..4444..4445..4446..4447..4448..4449..4450..4451..4452..4453..4454..4455..4456..4457..4458..4459..4460..4461..4462..4463..4464..4465..4466..4467..4468..4469..4470..4471..4472..4473..4474..4475..4476..4477..4478..4479..4480..4481..4482..4483..4484..4485..4486..4487..4488..4489..4490..4491..4492..4493..4494..4495..4496..4497..4498..4499..4500..4501..4502..4503..4504..4505..4506..4507..4508..4509..4510..4511..4512..4513..4514..4515..4516..4517..4518..4519..4520..4521..4522..4523..4524..4525..4526..4527..4528..4529..4530..4531..4532..4533..4534..4535..4536..4537..4538..4539..4540..4541..4542..4543..4544..4545..4546..4547..4548..4549..4550..4551..4552..4553..4554..4555..4556..4557..4558..4559..4560..4561..4562..4563..4564..4565..4566..4567..4568..4569..4570..4571..4572..4573..4574..4575..4576..4577..4578..4579..4580..4581..4582..4583..4584..4585..4586..4587..4588..4589..4590..4591..4592..4593..4594..4595..4596..4597..4598..4599..4600..4601..4602..4603..4604..4605..4606..4607..4608..4609..4610..4611..4612..4613..4614..4615..4616..4617..4618..4619..4620..4621..4622..4623..4624..4625..4626..4627..4628..4629..4630..4631..4632..4633..4634..4635..4636..4637..4638..4639..4640..4641..4642..4643..4644..4645..4646..4647..4648..4649..4650..4651..4652..4653..4654..4655..4656..4657..4658..4659..4660..4661..4662..4663..4664..4665..4666..4667..4668..4669..4670..4671..4672..4673..4674..4675..4676..4677..4678..4679..4680..4681..4682..4683..4684..4685..4686..4687..4688..4689..4690..4691..4692..4693..4694..4695..4696..4697..4698..4699..4700..4701..4702..4703..4704..4705..4706..4707..4708..4709..4710..4711..4712..4713..4714..4715..4716..4717..4718..4719..4720..4721..4722..4723..4724..4725..4726..4727..4728..4729..4730..4731..4732..4733..4734..4735..4736..4737..4738..4739..4740..4741..4742..4743..4744..4745..4746..4747..4748..4749..4750..4751..4752..4753..4754..4755..4756..4757..4758..4759..4760..4761..4762..4763..4764..4765..4766..4767..4768..4769..4770..4771..4772..4773..4774..4775..4776..4777..4778..4779..4780..4781..4782..4783..4784..4785..4786..4787..4788..4789..4790..4791..4792..4793..4794..4795..4796..4797..4798..4799..4800..4801..4802..4803..4804..4805..4806..4807..4808..4809..4810..4811..4812..4813..4814..4815..4816..4817..4818..4819..4820..4821..4822..4823..4824..4825..4826..4827..4828..4829..4830..4831..4832..4833..4834..4835..4836..4837..4838..4839..4840..4841..4842..4843..4844..4845..4846..4847..4848..4849..4850..4851..4852..4853..4854..4855..4856..4857..4858..4859..4860..4861..4862..4863..4864..4865..4866..4867..4868..4869..4870..4871..4872..4873..4874..4875..4876..4877..4878..4879..4880..4881..4882..4883..4884..4885..4886..4887..4888..4889..4890..4891..4892..4893..4894..4895..4896..4897..4898..4899..4900..4901..4902..4903..4904..4905..4906..4907..4908..4909..4910..4911..4912..4913..4914..4915..4916..4917..4918..4919..4920..4921..4922..4923..4924..4925..4926..4927..4928..4929..4930..4931..4932..4933..4934..4935..4936..4937..4938..4939..4940..4941..4942..4943..4944..4945..4946..4947..4948..4949..4950..4951..4952..4953..4954..4955..4956..4957..4958..4959..4960..4961..4962..4963..4964..4965..4966..4967..4968..4969..4970..4971..4972..4973..4974..4975..4976..4977..4978..4979..4980..4981..4982..4983..4984..4985..4986..4987..4988..4989..4990..4991..4992..4993..4994..4995..4996..4997..4998..4999..5000..5001..5002..5003..5004..5005..5006..5007..5008..5009..5010..5011..5012..5013..5014..5015..5016..5017..5018..5019..5020..5021..5022..5023..5024..5025..5026..5027..5028..5029..5030..5031..5032..5033..5034..5035..5036..5037..5038..5039..5040..5041..5042..5043..5044..5045..5046..5047..5048..5049..5050..5051..5052..5053..5054..5055..5056..5057..5058..5059..5060..5061..5062..5063..5064..5065..5066..5067..5068..5069..5070..5071..5072..5073..5074..5075..5076..5077..5078..5079..5080..5081..5082..5083..5084..5085..5086..5087..5088..5089..5090..5091..5092..5093..5094..5095..5096..5097..5098..5099..5100..5101..5102..5103..5104..5105..5106..5107..5108..5109..5110..5111..5112..5113..5114..5115..5116..5117..5118..5119..5120..5121..5122..5123..5124..5125..5126..5127..5128..5129..5130..5131..5132..5133..5134..5135..5136..5137..5138..5139..5140..5141..5142..5143..5144..5145..5146..5147..5148..5149..5150..5151..5152..5153..5154..5155..5156..5157..5158..5159..5160..5161..5162..5163..5164..5165..5166..5167..5168..5169..5170..5171..5172..5173..5174..5175..5176..5177..5178..5179..5180..5181..5182..5183..5184..5185..5186..5187..5188..5189..5190..5191..5192..5193..5194..5195..5196..5197..5198..5199..5200..5201..5202..5203..5204..5205..5206..5207..5208..5209..5210..5211..5212..5213..5214..5215..5216..5217..5218..5219..5220..5221..5222..5223..5224..5225..5226..5227..5228..5229..5230..5231..5232..5233..5234..5235..5236..5237..5238..5239..5240..5241..5242..5243..5244..5245..5246..5247..5248..5249..5250..5251..5252..5253..5254..5255..5256..5257..5258..5259..5260..5261..5262..5263..5264..5265..5266..5267..5268..5269..5270..5271..5272..5273..5274..5275..5276..5277..5278..5279..5280..5281..5282..5283..5284..5285..5286..5287..5288..5289..5290..5291..5292..5293..5294..5295..5296..5297..5298..5299..5300..5301..5302..5303..5304..5305..5306..5307..5308..5309..5310..5311..5312..5313..5314..5315..5316..5317..5318..5319..5320..5321..5322..5323..5324..5325..5326..5327..5328..5329..5330..5331..5332..5333..5334..5335..5336..5337..5338..5339..5340..5341..5342..5343..5344..5345..5346..5347..5348..5349..5350..5351..5352..5353..5354..5355..5356..5357..5358..5359..5360..5361..5362..5363..5364..5365..5366..5367..5368..5369..5370..5371..5372..5373..5374..5375..5376..5377..5378..5379..5380..5381..5382..5383..5384..5385..5386..5387..5388..5389..5390..5391..5392..5393..5394..5395..5396..5397..5398..5399..5400..5401..5402..5403..5404..5405..5406..5407..5408..5409..5410..5411..5412..5413..5414..5415..5416..5417..5418..5419..5420..5421..5422..5423..5424..5425..5426..5427..5428..5429..5430..5431..5432..5433..5434..5435..5436..5437..5438..5439..5440..5441..5442..5443..5444..5445..5446..5447..5448..5449..5450..5451..5452..5453..5454..5455..5456..5457..5458..5459..5460..5461..5462..5463..5464..5465..5466..5467..5468..5469..5470..5471..5472..5473..5474..5475..5476..5477..5478..5479..5480..5481..5482..5483..5484..5485..5486..5487..5488..5489..5490..5491..5492..5493..5494..5495..5496..5497..5498..5499..5500..5501..5502..5503..5504..5505..5506..5507..5508..5509..5510..5511..5512..5513..5514..5515..5516..5517..5518..5519..5520..5521..5522..5523..5524..5525..5526..5527..5528..5529..5530..5531..5532..5533..5534..5535..5536..5537..5538..5539..5540..5541..5542..5543..5544..5545..5546..5547..5548..5549..5550..5551..5552..5553..5554..5555..5556..5557..5558..5559..5560..5561..5562..5563..5564..5565..5566..5567..5568..5569..5570..5571..5572..5573..5574..5575..5576..5577..5578..5579..5580..5581..5582..5583..5584..5585..5586..5587..5588..5589..5590..5591..5592..5593..5594..5595..5596..5597..5598..5599..5600..5601..5602..5603..5604..5605..5606..5607..5608..5609..5610..5611..5612..5613..5614..5615..5616..5617..5618..5619..5620..5621..5622..5623..5624..5625..5626..5627..5628..5629..5630..5631..5632..5633..5634..5635..5636..5637..5638..5639..5640..5641..5642..5643..5644..5645..5646..5647..5648..5649.."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5650..5651..5652..5653..5654..5655..5656..5657..5658..5659..5660..5661..5662..5663..5664..5665..5666..5667..5668..5669..5670..5671..5672..5673..5674..5675..5676..5677..5678..5679..5680..5681..5682..5683..5684..5685..5686..5687..5688..5689..5690..5691..5692..5693..5694..5695..5696..5697..5698..5699..5700..5701..5702..5703..5704..5705..5706..5707..5708..5709..5710..5711..5712..5713..5714..5715..5716..5717..5718..5719..5720..5721..5722..5723..5724..5725..5726..5727..5728..5729..5730..5731..5732..5733..5734..5735..5736..5737..5738..5739..5740..5741..5742..5743..5744..5745..5746..5747..5748..5749..5750..5751..5752..5753..5754..5755..5756..5757..5758..5759..5760..5761..5762..5763..5764..5765..5766..5767..5768..5769..5770..5771..5772..5773..5774..5775..5776..5777..5778..5779..5780..5781..5782..5783..5784..5785..5786..5787..5788..5789..5790..5791..5792..5793..5794..5795..5796..5797..5798..5799..5800..5801..5802..5803..5804..5805..5806..5807..5808..5809..5810..5811..5812..5813..5814..5815..5816..5817..5818..5819..5820..5821..5822..5823..5824..5825..5826..5827..5828..5829..5830..5831..5832..5833..5834..5835..5836..5837..5838..5839..5840..5841..5842..5843..5844..5845..5846..5847..5848..5849..5850..5851..5852..5853..5854..5855..5856..5857..5858..5859..5860..5861..5862..5863..5864..5865..5866..5867..5868..5869..5870..5871..5872..5873..5874..5875..5876..5877..5878..5879..5880..5881..5882..5883..5884..5885..5886..5887..5888..5889..5890..5891..5892..5893..5894..5895..5896..5897..5898..5899..5900..5901..5902..5903..5904..5905..5906..5907..5908..5909..5910..5911..5912..5913..5914..5915..5916..5917..5918..5919..5920..5921..5922..5923..5924..5925..5926..5927..5928..5929..5930..5931..5932..5933..5934..5935..5936..5937..5938..5939..5940..5941..5942..5943..5944..5945..5946..5947..5948..5949..5950..5951..5952..5953..5954..5955..5956..5957..5958..5959..5960..5961..5962..5963..5964..5965..5966..5967..5968..5969..5970..5971..5972..5973..5974..5975..5976..5977..5978..5979..5980..5981..5982..5983..5984..5985..5986..5987..5988..5989..5990..5991..5992..5993..5994..5995..5996..5997..5998..5999..6000..6001..6002..6003..6004..6005..6006..6007..6008..6009..6010..6011..6012..6013..6014..6015..6016..6017..6018..6019..6020..6021..6022..6023..6024..6025..6026..6027..6028..6029..6030..6031..6032..6033..6034..6035..6036..6037..6038..6039..6040..6041..6042..6043..6044..6045..6046..6047..6048..6049..6050..6051..6052..6053..6054..6055..6056..6057..6058..6059..6060..6061..6062..6063..6064..6065..6066..6067..6068..6069..6070..6071..6072..6073..6074..6075..6076..6077..6078..6079..6080..6081..6082..6083..6084..6085..6086..6087..6088..6089..6090..6091..6092..6093..6094..6095..6096..6097..6098..6099..6100..6101..6102..6103..6104..6105..6106..6107..6108..6109..6110..6111..6112..6113..6114..6115..6116..6117..6118..6119..6120..6121..6122..6123..6124..6125..6126..6127..6128..6129..6130..6131..6132..6133..6134..6135..6136..6137..6138..6139..6140..6141..6142..6143..6144..6145..6146..6147..6148..6149..6150..6151..6152..6153..6154..6155..6156..6157..6158..6159..6160..6161..6162..6163..6164..6165..6166..6167..6168..6169..6170..6171..6172..6173..6174..6175..6176..6177..6178..6179..6180..6181..6182..6183..6184..6185..6186..6187..6188..6189..6190..6191..6192..6193..6194..6195..6196..6197..6198..6199..6200..6201..6202..6203..6204..6205..6206..6207..6208..6209..6210..6211..6212..6213..6214..6215..6216..6217..6218..6219..6220..6221..6222..6223..6224..6225..6226..6227..6228..6229..6230..6231..6232..6233..6234..6235..6236..6237..6238..6239..6240..6241..6242..6243..6244..6245..6246..6247..6248..6249..6250..6251..6252..6253..6254..6255..6256..6257..6258..6259..6260..6261..6262..6263..6264..6265..6266..6267..6268..6269..6270..6271..6272..6273..6274..6275..6276..6277..6278..6279..6280..6281..6282..6283..6284..6285..6286..6287..6288..6289..6290..6291..6292..6293..6294..6295..6296..6297..6298..6299..6300..6301..6302..6303..6304..6305..6306..6307..6308..6309..6310..6311..6312..6313..6314..6315..6316..6317..6318..6319..6320..6321..6322..6323..6324..6325..6326..6327..6328..6329..6330..6331..6332..6333..6334..6335..6336..6337..6338..6339..6340..6341..6342..6343..6344..6345..6346..6347..6348..6349..6350..6351..6352..6353..6354..6355..6356..6357..6358..6359..6360..6361..6362..6363..6364..6365..6366..6367..6368..6369..6370..6371..6372..6373..6374..6375..6376..6377..6378..6379..6380..6381..6382..6383..6384..6385..6386..6387..6388..6389..6390..6391..6392..6393..6394..6395..6396..6397..6398..6399..6400..6401..6402..6403..6404..6405..6406..6407..6408..6409..6410..6411..6412..6413..6414..6415..6416..6417..6418..6419..6420..6421..6422..6423..6424..6425..6426..6427..6428..6429..6430..6431..6432..6433..6434..6435..6436..6437..6438..6439..6440..6441..6442..6443..6444..6445..6446..6447..6448..6449..6450..6451..6452..6453..6454..6455..6456..6457..6458..6459..6460..6461..6462..6463..6464..6465..6466..6467..6468..6469..6470..6471..6472..6473..6474..6475..6476..6477..6478..6479..6480..6481..6482..6483..6484..6485..6486..6487..6488..6489..6490..6491..6492..6493..6494..6495..6496..6497..6498..6499..6500..6501..6502..6503..6504..6505..6506..6507..6508..6509..6510..6511..6512..6513..6514..6515..6516..6517..6518..6519..6520..6521..6522..6523..6524..6525..6526..6527..6528..6529..6530..6531..6532..6533..6534..6535..6536..6537..6538..6539..6540..6541..6542..6543..6544..6545..6546..6547..6548..6549..6550..6551..6552..6553..6554..6555..6556..6557..6558..6559..6560..6561..6562..6563..6564..6565..6566..6567..6568..6569..6570..6571..6572..6573..6574..6575..6576..6577..6578..6579..6580..6581..6582..6583..6584..6585..6586..6587..6588..6589..6590..6591..6592..6593..6594..6595..6596..6597..6598..6599..6600..6601..6602..6603..6604..6605..6606..6607..6608..6609..6610..6611..6612..6613..6614..6615..6616..6617..6618..6619..6620..6621..6622..6623..6624..6625..6626..6627..6628..6629..6630..6631..6632..6633..6634..6635..6636..6637..6638..6639..6640..6641..6642..6643..6644..6645..6646..6647..6648..6649..6650..6651..6652..6653..6654..6655..6656..6657..6658..6659..6660..6661..6662..6663..6664..6665..6666..6667..6668..6669..6670..6671..6672..6673..6674..6675..6676..6677..6678..6679..6680..6681..6682..6683..6684..6685..6686..6687..6688..6689..6690..6691..6692..6693..6694..6695..6696..6697..6698..6699..6700..6701..6702..6703..6704..6705..6706..6707..6708..6709..6710..6711..6712..6713..6714..6715..6716..6717..6718..6719..6720..6721..6722..6723..6724..6725..6726..6727..6728..6729..6730..6731..6732..6733..6734..6735..6736..6737..6738..6739..6740..6741..6742..6743..6744..6745..6746..6747..6748..6749..6750..6751..6752..6753..6754..6755..6756..6757..6758..6759..6760..6761..6762..6763..6764..6765..6766..6767..6768..6769..6770..6771..6772..6773..6774..6775..6776..6777..6778..6779..6780..6781..6782..6783..6784..6785..6786..6787..6788..6789..6790..6791..6792..6793..6794..6795..6796..6797..6798..6799..6800..6801..6802..6803..6804..6805..6806..6807..6808..6809..6810..6811..6812..6813..6814..6815..6816..6817..6818..6819..6820..6821..6822..6823..6824..6825..6826..6827..6828..6829..6830..6831..6832..6833..6834..6835..6836..6837..6838..6839..6840..6841..6842..6843..6844..6845..6846..6847..6848..6849..6850..6851..6852..6853..6854..6855..6856..6857..6858..6859..6860..6861..6862..6863..6864..6865..6866..6867..6868..6869..6870..6871..6872..6873..6874..6875..6876..6877..6878..6879..6880..6881..6882..6883..6884..6885..6886..6887..6888..6889..6890..6891..6892..6893..6894..6895..6896..6897..6898..6899..6900..6901..6902..6903..6904..6905..6906..6907..6908..6909..6910..6911..6912..6913..6914..6915..6916..6917..6918..6919..6920..6921..6922..6923..6924..6925..6926..6927..6928..6929..6930..6931..6932..6933..6934..6935..6936..6937..6938..6939..6940..6941..6942..6943..6944..6945..6946..6947..6948..6949..6950..6951..6952..6953..6954..6955..6956..6957..6958..6959..6960..6961..6962..6963..6964..6965..6966..6967..6968..6969..6970..6971..6972..6973..6974..6975..6976..6977..6978..6979..6980..6981..6982..6983..6984..6985..6986..6987..6988..6989..6990..6991..6992..6993..6994..6995..6996..6997..6998..6999..7000..7001..7002..7003..7004..7005..7006..7007..7008..7009..7010..7011..7012..7013..7014..7015..7016..7017.."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7018..7019..7020..7021..7022..7023..7024..7025..7026..7027..7028..7029..7030..7031..7032..7033..7034..7035..7036..7037..7038..7039..7040..7041..7042..7043..7044..7045..7046..7047..7048..7049..7050..7051..7052..7053..7054..7055..7056..7057..7058..7059..7060..7061..7062..7063..7064..7065..7066..7067..7068..7069..7070..7071..7072..7073..7074..7075..7076..7077..7078..7079..7080..7081..7082..7083..7084..7085..7086..7087..7088..7089..7090..7091..7092..7093..7094..7095..7096..7097..7098..7099..7100..7101..7102..7103..7104..7105..7106..7107..7108..7109..7110..7111..7112..7113..7114..7115..7116..7117..7118..7119..7120..7121..7122..7123..7124..7125..7126..7127..7128..7129..7130..7131..7132..7133..7134..7135..7136..7137..7138..7139..7140..7141..7142..7143..7144..7145..7146..7147..7148..7149..7150..7151..7152..7153..7154..7155..7156..7157..7158..7159..7160..7161..7162..7163..7164..7165..7166..7167..7168..7169..7170..7171..7172..7173..7174..7175..7176..7177..7178..7179..7180..7181..7182..7183..7184..7185..7186..7187..7188..7189..7190..7191..7192..7193..7194..7195..7196..7197..7198..7199..7200..7201..7202..7203..7204..7205..7206..7207..7208..7209..7210..7211..7212..7213..7214..7215..7216..7217..7218..7219..7220..7221..7222..7223..7224..7225..7226..7227..7228..7229..7230..7231..7232..7233..7234..7235..7236..7237..7238..7239..7240..7241..7242..7243..7244..7245..7246..7247..7248..7249..7250..7251..7252..7253..7254..7255..7256..7257..7258..7259..7260..7261..7262..7263..7264..7265..7266..7267..7268..7269..7270..7271..7272..7273..7274..7275..7276..7277..7278..7279..7280..7281..7282..7283..7284..7285..7286..7287..7288..7289..7290..7291..7292..7293..7294..7295..7296..7297..7298..7299..7300..7301..7302..7303..7304..7305..7306..7307..7308..7309..7310..7311..7312..7313..7314..7315..7316..7317..7318..7319..7320..7321..7322..7323..7324..7325..7326..7327..7328..7329..7330..7331..7332..7333..7334..7335..7336..7337..7338..7339..7340..7341..7342..7343..7344..7345..7346..7347..7348..7349..7350..7351..7352..7353..7354..7355..7356..7357..7358..7359..7360..7361..7362..7363..7364..7365..7366..7367..7368..7369..7370..7371..7372..7373..7374..7375..7376..7377..7378..7379..7380..7381..7382..7383..7384..7385..7386..7387..7388..7389..7390..7391..7392..7393..7394..7395..7396..7397..7398..7399..7400..7401..7402..7403..7404..7405..7406..7407..7408..7409..7410..7411..7412..7413..7414..7415..7416..7417..7418..7419..7420..7421..7422..7423..7424..7425..7426..7427..7428..7429..7430..7431..7432..7433..7434..7435..7436..7437..7438..7439..7440..7441..7442..7443..7444..7445..7446..7447..7448..7449..7450..7451..7452..7453..7454..7455..7456..7457..7458..7459..7460..7461..7462..7463..7464..7465..7466..7467..7468..7469..7470..7471..7472..7473..7474..7475..7476..7477..7478..7479..7480..7481..7482..7483..7484..7485..7486..7487..7488..7489..7490..7491..7492..7493..7494..7495..7496..7497..7498..7499..7500..7501..7502..7503..7504..7505..7506..7507..7508..7509..7510..7511..7512..7513..7514..7515..7516..7517..7518..7519..7520..7521..7522..7523..7524..7525..7526..7527..7528..7529..7530..7531..7532..7533..7534..7535..7536..7537..7538..7539..7540..7541..7542..7543..7544..7545..7546..7547..7548..7549..7550..7551..7552..7553..7554..7555..7556..7557..7558..7559..7560..7561..7562..7563..7564..7565..7566..7567..7568..7569..7570..7571..7572..7573..7574..7575..7576..7577..7578..7579..7580..7581..7582..7583..7584..7585..7586..7587..7588..7589..7590..7591..7592..7593..7594..7595..7596..7597..7598..7599..7600..7601..7602..7603..7604..7605..7606..7607..7608..7609..7610..7611..7612..7613..7614..7615..7616..7617..7618..7619..7620..7621..7622..7623..7624..7625..7626..7627..7628..7629..7630..7631..7632..7633..7634..7635..7636..7637..7638..7639..7640..7641..7642..7643..7644..7645..7646..7647..7648..7649..7650..7651..7652..7653..7654..7655..7656..7657..7658..7659..7660..7661..7662..7663..7664..7665..7666..7667..7668..7669..7670..7671..7672..7673..7674..7675..7676..7677..7678..7679..7680..7681..7682..7683..7684..7685..7686..7687..7688..7689..7690..7691..7692..7693..7694..7695..7696..7697..7698..7699..7700..7701..7702..7703..7704..7705..7706..7707..7708..7709..7710..7711..7712..7713..7714..7715..7716..7717..7718..7719..7720..7721..7722..7723..7724..7725..7726..7727..7728..7729..7730..7731..7732..7733..7734..7735..7736..7737..7738..7739..7740..7741..7742..7743..7744..7745..7746..7747..7748..7749..7750..7751..7752..7753..7754..7755..7756..7757..7758..7759..7760..7761..7762..7763..7764..7765..7766..7767..7768..7769..7770..7771..7772..7773..7774..7775..7776..7777..7778..7779..7780..7781..7782..7783..7784..7785..7786..7787..7788..7789..7790..7791..7792..7793..7794..7795..7796..7797..7798..7799..7800..7801..7802..7803..7804..7805..7806..7807..7808..7809..7810..7811..7812..7813..7814..7815..7816..7817..7818..7819..7820..7821..7822..7823..7824..7825..7826..7827..7828..7829..7830..7831..7832..7833..7834..7835..7836..7837..7838..7839..7840..7841..7842..7843..7844..7845..7846..7847..7848..7849..7850..7851..7852..7853..7854..7855..7856..7857..7858..7859..7860..7861..7862..7863..7864..7865..7866..7867..7868..7869..7870..7871..7872..7873..7874..7875..7876..7877..7878..7879..7880..7881..7882..7883..7884..7885..7886..7887..7888..7889..7890..7891..7892..7893..7894..7895..7896..7897..7898..7899..7900..7901..7902..7903..7904..7905..7906..7907..7908..7909..7910..7911..7912..7913..7914..7915..7916..7917..7918..7919..7920..7921..7922..7923..7924..7925..7926..7927..7928..7929..7930..7931..7932..7933..7934..7935..7936..7937..7938..7939..7940..7941..7942..7943..7944..7945..7946..7947..7948..7949..7950..7951..7952..7953..7954..7955..7956..7957..7958..7959..7960..7961..7962..7963..7964..7965..7966..7967..7968..7969..7970..7971..7972..7973..7974..7975..7976..7977..7978..7979..7980..7981..7982..7983..7984..7985..7986..7987..7988..7989..7990..7991..7992..7993.."
     ]
    }
   ],
   "source": [
    "for movie_index1 in range(movie_quantity):\n",
    "#     movie_user_index1 = set(np.where(user_movie_rating_array[:,movie_index1] > 0)[0].tolist())\n",
    "    movie_user_index1 = set(movie_user_dict[movie_index1])\n",
    "    for movie_index2 in range(movie_index1 + 1 ,movie_quantity):\n",
    "        movie_user_index2 = set(movie_user_dict[movie_index2])\n",
    "        movie_user_union = list(\n",
    "            movie_user_index1 & set(movie_user_index2)\n",
    "        )\n",
    "        if len(movie_user_union) > 300:\n",
    "            movie_user_union = random.sample(movie_user_union,300)\n",
    "        # 公共用户的打分向量\n",
    "        movie1_user_rating_v = user_movie_rating_array[:,movie_index1][movie_user_union]\n",
    "        movie2_user_rating_v = user_movie_rating_array[:,movie_index2][movie_user_union]\n",
    "        # 时间惩罚向量\n",
    "        time_punish_v = np.around(1 / (1 + np.abs(user_movie_time_array[:,movie_index1][movie_user_union] - user_movie_time_array[:,movie_index2][movie_user_union]) / 200000),3)\n",
    "        # 用户活跃度惩罚向量\n",
    "        this_user_popular_punish_v = user_popular_punish_v[movie_user_union]\n",
    "        sim = np.around((movie1_user_rating_v * movie2_user_rating_v * time_punish_v * this_user_popular_punish_v).sum() / np.sqrt( np.square(movie1_user_rating_v).sum() * np.square(movie2_user_rating_v).sum() ) ,3)\n",
    "        movie_sim_array[movie_index1][movie_index2] = sim\n",
    "        movie_sim_array[movie_index2][movie_index1] = sim\n",
    "    print(movie_index1,end='..')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.   , 0.181, 0.202, ...,   nan,   nan,   nan],\n",
       "       [0.181, 0.   , 0.185, ..., 0.   , 0.   , 0.   ],\n",
       "       [0.202, 0.185, 0.   , ..., 0.   , 0.   , 0.   ],\n",
       "       ...,\n",
       "       [  nan, 0.   , 0.   , ..., 0.   ,   nan,   nan],\n",
       "       [  nan, 0.   , 0.   , ...,   nan, 0.   , 0.025],\n",
       "       [  nan, 0.   , 0.   , ...,   nan, 0.025, 0.   ]])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "movie_sim_array"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 生成推荐"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0..100..200..300..400..500..600..700..800..900..1000..1100..1200..1300..1400..1500..1600..1700..1800..1900..2000..2100..2200..2300..2400..2500..2600..2700..2800..2900..3000..3100..3200..3300..3400..3500..3600..3700..3800..3900..4000..4100..4200..4300..4400..4500..4600..4700..4800..4900..5000..5100..5200..5300..5400..5500..5600..5700..5800..5900..6000..6100..6200..6300..6400..6500..6600..6700..6800..6900..7000..7100..7200..7300..7400..7500..7600..7700..7800..7900..8000..8100..8200..8300..8400..8500..8600..8700..8800..8900..9000..9100..9200..9300..9400..9500..9600..9700..9800..9900..10000..10100..10200..10300..10400..10500..10600..10700..10800..10900..11000..11100..11200..11300..11400..11500..11600..11700..11800..11900..12000..12100..12200..12300..12400..12500..12600..12700..12800..12900..13000..13100..13200..13300..13400..13500..13600..13700..13800..13900..14000..14100..14200..14300..14400..14500..14600..14700..14800..14900..15000..15100..15200..15300..15400..15500..15600..15700..15800..15900..16000..16100..16200..16300..16400..16500..16600..16700..16800..16900..17000..17100..17200..17300..17400..17500..17600..17700..17800..17900..18000..18100..18200..18300..18400..18500..18600..18700..18800..18900..19000..19100..19200..19300..19400..19500..19600..19700..19800..19900..20000..20100..20200..20300..20400..20500..20600..20700..20800..20900..21000..21100..21200..21300..21400..21500..21600..21700..21800..21900..22000..22100..22200..22300..22400..22500..22600..22700..22800..22900..23000..23100..23200..23300..23400..23500..23600..23700..23800..23900..24000..24100..24200..24300..24400..24500..24600..24700..24800..24900..25000..25100..25200..25300..25400..25500..25600..25700..25800..25900..26000..26100..26200..26300..26400..26500..26600..26700..26800..26900..27000..27100..27200..27300..27400..27500..27600..27700..27800..27900..28000..28100..28200..28300..28400..28500..28600..28700..28800..28900..29000..29100..29200..29300..29400..29500..29600..29700..29800..29900..30000..30100..30200..30300..30400..30500..30600..30700..30800..30900..31000..31100..31200..31300..31400..31500..31600..31700..31800..31900..32000..32100..32200..32300..32400..32500..32600..32700..32800..32900..33000..33100..33200..33300..33400..33500..33600..33700..33800..33900..34000..34100..34200..34300..34400..34500..34600..34700..34800..34900..35000..35100..35200..35300..35400..35500..35600..35700..35800..35900..36000..36100..36200..36300..36400..36500..36600..36700..36800..36900..37000..37100..37200..37300..37400..37500..37600..37700..37800..37900..38000..38100..38200..38300..38400..38500..38600..38700..38800..38900..39000..39100..39200..39300..39400..39500..39600..39700..39800..39900..40000..40100..40200..40300..40400..40500..40600..40700..40800..40900..41000..41100..41200..41300..41400..41500..41600..41700..41800..41900..42000..42100..42200..42300..42400..42500..42600..42700..42800..42900..43000..43100..43200..43300..43400..43500..43600..43700..43800..43900..44000..44100..44200..44300..44400..44500..44600..44700..44800..44900..45000..45100..45200..45300..45400..45500..45600..45700..45800..45900..46000..46100..46200..46300..46400..46500..46600..46700..46800..46900..47000..47100..47200..47300..47400..47500..47600..47700..47800..47900..48000..48100..48200..48300..48400..48500..48600..48700..48800..48900..49000..49100..49200..49300..49400..49500..49600..49700..49800..49900..50000..50100..50200..50300..50400..50500..50600..50700..50800..50900..51000..51100..51200..51300..51400..51500..51600..51700..51800..51900..52000..52100.."
     ]
    }
   ],
   "source": [
    "user_recommend = {}\n",
    "\n",
    "for user_index in range(user_quantity):\n",
    "    fav_movie_indexs = np.where(\n",
    "        user_movie_rating_array[user_index] >= 3\n",
    "    )[0].tolist()\n",
    "    df_sim_sum = pd.DataFrame(movie_sim_array[fav_movie_indexs].sum(axis=0),columns=['sim_sum'])\n",
    "    user_recommend[user_index] = df_sim_sum.query(\n",
    "        'sim_sum > 0'\n",
    "    ).sort_values(by='sim_sum',ascending=False).index[:100].tolist()\n",
    "    if user_index % 100 == 0:print(user_index,end='..')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>movie_id</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1090</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:44:13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1136</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:30:09</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>1193</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:31:30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1208</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:33:35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1219</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2004-09-10 03:13:14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id  movie_id  rating            timestamp\n",
       "0        1      1090     4.0  2005-04-02 23:44:13\n",
       "1        1      1136     3.5  2005-04-02 23:30:09\n",
       "2        1      1193     3.5  2005-04-02 23:31:30\n",
       "3        1      1208     3.5  2005-04-02 23:33:35\n",
       "4        1      1219     4.0  2004-09-10 03:13:14"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating_text = pd.read_csv('./data/rating_text.csv')\n",
    "df_rating_text.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_index</th>\n",
       "      <th>movie_index</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>291</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:44:13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>232</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:30:09</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>53</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:31:30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>54</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:33:35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>55</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2004-09-10 03:13:14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_index  movie_index  rating            timestamp\n",
       "0           0          291     4.0  2005-04-02 23:44:13\n",
       "1           0          232     3.5  2005-04-02 23:30:09\n",
       "2           0           53     3.5  2005-04-02 23:31:30\n",
       "3           0           54     3.5  2005-04-02 23:33:35\n",
       "4           0           55     4.0  2004-09-10 03:13:14"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def deal_with_userid(user_id):\n",
    "    return user_id_to_index_dict[user_id] if user_id in user_id_to_index_dict.keys() else None\n",
    "\n",
    "def deal_with_movieid(movie_id):\n",
    "    return movie_id_to_index_dict[movie_id] if movie_id in movie_id_to_index_dict.keys() else None\n",
    "\n",
    "df_rating_text['user_id'] = df_rating_text['user_id'].apply(deal_with_userid)\n",
    "df_rating_text['movie_id'] = df_rating_text['movie_id'].apply(deal_with_movieid)\n",
    "df_rating_text = df_rating_text.dropna()\n",
    "df_rating_text.columns = ['user_index','movie_index','rating','timestamp']\n",
    "df_rating_text['user_index'] = df_rating_text['user_index'].astype(int)\n",
    "df_rating_text['movie_index'] = df_rating_text['movie_index'].astype(int)\n",
    "df_rating_text.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0..100..200..300..400..500..600..700..800..900..1000..1100..1200..1300..1400..1500..1600..1700..1800..1900..2000..2100..2200..2300..2400..2500..2600..2700..2800..2900..3000..3100..3200..3300..3400..3500..3600..3700..3800..3900..4000..4100..4200..4300..4400..4500..4600..4700..4800..4900..5000..5100..5200..5300..5400..5500..5600..5700..5800..5900..6000..6100..6200..6300..6400..6500..6600..6700..6800..6900..7000..7100..7200..7300..7400..7500..7600..7700..7800..7900..8000..8100..8200..8300..8400..8500..8600..8700..8800..8900..9000..9100..9200..9300..9400..9500..9600..9700..9800..9900..10000..10100..10200..10300..10400..10500..10600..10700..10800..10900..11000..11100..11200..11300..11400..11500..11600..11700..11800..11900..12000..12100..12200..12300..12400..12500..12600..12700..12800..12900..13000..13100..13200..13300..13400..13500..13600..13700..13800..13900..14000..14100..14200..14300..14400..14500..14600..14700..14800..14900..15000..15100..15200..15300..15400..15500..15600..15700..15800..15900..16000..16100..16200..16300..16400..16500..16600..16700..16800..16900..17000..17100..17200..17300..17400..17500..17600..17700..17800..17900..18000..18100..18200..18300..18400..18500..18600..18700..18800..18900..19000..19100..19200..19300..19400..19500..19600..19700..19800..19900..20000..20100..20200..20300..20400..20500..20600..20700..20800..20900..21000..21100..21200..21300..21400..21500..21600..21700..21800..21900..22000..22100..22200..22300..22400..22500..22600..22700..22800..22900..23000..23100..23200..23300..23400..23500..23600..23700..23800..23900..24000..24100..24200..24300..24400..24500..24600..24700..24800..24900..25000..25100..25200..25300..25400..25500..25600..25700..25800..25900..26000..26100..26200..26300..26400..26500..26600..26700..26800..26900..27000..27100..27200..27300..27400..27500..27600..27700..27800..27900..28000..28100..28200..28300..28400..28500..28600..28700..28800..28900..29000..29100..29200..29300..29400..29500..29600..29700..29800..29900..30000..30100..30200..30300..30400..30500..30600..30700..30800..30900..31000..31100..31200..31300..31400..31500..31600..31700..31800..31900..32000..32100..32200..32300..32400..32500..32600..32700..32800..32900..33000..33100..33200..33300..33400..33500..33600..33700..33800..33900..34000..34100..34200..34300..34400..34500..34600..34700..34800..34900..35000..35100..35200..35300..35400..35500..35600..35700..35800..35900..36000..36100..36200..36300..36400..36500..36600..36700..36800..36900..37000..37100..37200..37300..37400..37500..37600..37700..37800..37900..38000..38100..38200..38300..38400..38500..38600..38700..38800..38900..39000..39100..39200..39300..39400..39500..39600..39700..39800..39900..40000..40100..40200..40300..40400..40500..40600..40700..40800..40900..41000..41100..41200..41300..41400..41500..41600..41700..41800..41900..42000..42100..42200..42300..42400..42500..42600..42700..42800..42900..43000..43100..43200..43300..43400..43500..43600..43700..43800..43900..44000..44100..44200..44300..44400..44500..44600..44700..44800..44900..45000..45100..45200..45300..45400..45500..45600..45700..45800..45900..46000..46100..46200..46300..46400..46500..46600..46700..46800..46900..47000..47100..47200..47300..47400..47500..47600..47700..47800..47900..48000..48100..48200..48300..48400..48500..48600..48700..48800..48900..49000..49100..49200..49300..49400..49500..49600..49700..49800..49900..50000..50100..50200..50300..50400..50500..50600..50700..50800..50900..51000..51100..51200..51300..51400..51500..51600..51700..51800..51900..52000..52100.."
     ]
    }
   ],
   "source": [
    "user_fav = {}\n",
    "\n",
    "for user_index,groupby_userindex in df_rating_text.groupby('user_index'):\n",
    "    movies_rating = groupby_userindex.groupby('movie_index')['rating'].mean()\n",
    "    user_fav[user_index] = movies_rating[\n",
    "        movies_rating >= 3\n",
    "    ].index.tolist()\n",
    "    if user_index % 100 == 0:print(user_index,end='..')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 计算准确率和召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "precision 0.09016539162783634\n",
      "recall 0.400925066067011\n"
     ]
    }
   ],
   "source": [
    "union_quantity = 0\n",
    "recommend_quantity = 0\n",
    "fav_quantity = 0\n",
    "\n",
    "\n",
    "for user_index in user_recommend.keys():\n",
    "    if user_index in user_fav.keys():\n",
    "        union_quantity += len(\n",
    "            set(user_recommend[user_index]) & set(user_fav[user_index])\n",
    "        )\n",
    "        recommend_quantity += len(user_recommend[user_index])\n",
    "        fav_quantity += len(user_fav[user_index])\n",
    "print('precision',union_quantity / recommend_quantity)\n",
    "print('recall',union_quantity / fav_quantity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "ename": "MemoryError",
     "evalue": "Unable to allocate array with shape (7992, 52188) and data type float64",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mMemoryError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-60-f88c208123a9>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0muser_movie_rating_array\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mmovie_quantity\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mMemoryError\u001b[0m: Unable to allocate array with shape (7992, 52188) and data type float64"
     ]
    }
   ],
   "source": [
    "user_movie_rating_array[:,[i for i in range(2,movie_quantity)]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4. , 3. , 3.5, ..., 0. , 0. , 0. ],\n",
       "       [0. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
       "       [0. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
       "       ...,\n",
       "       [0. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
       "       [4. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
       "       [4.5, 0. , 0. , ..., 0. , 0. , 0. ]])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_movie_rating_array[:,2:movie_quantity]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "                           "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  },
  "pycharm": {
   "stem_cell": {
    "cell_type": "raw",
    "metadata": {
     "collapsed": false
    },
    "source": []
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
